home *** CD-ROM | disk | FTP | other *** search
- # Interface to the interactive CWI library catalog.
-
- import sys
- import stdwin
- from stdwinevents import *
- import select
- import telnetlib
- import vt100win
- from form import Form
-
-
- # Main program
-
- def main():
- vt = vt100win.VT100win()
- #
- host = 'biefstuk.cwi.nl'
- tn = telnetlib.Telnet(host, 0)
- #
- try:
- vt.send(tn.read_until('login: ', 10))
- tn.write('cwilib\r')
- #
- vt.send(tn.read_until('Hit <RETURN> to continue...', 10))
- tn.write('\r')
- #
- vt.send(tn.read_until('QUIT', 20))
- except EOFError:
- sys.stderr.write('Connection closed prematurely\n')
- sys.exit(1)
- #
- define_screens(vt)
- matches = vt.which_screens()
- if 'menu' not in matches:
- sys.stderr.write('Main menu does not appear\n')
- sys.exit(1)
- #
- tn.write('\r\r')
- vt.open('Progress -- CWI Library')
- vt.set_debuglevel(0)
- ui = UserInterface()
- #
- while 1:
- try:
- data = tn.read_very_eager()
- except EOFError:
- stdwin.message('Connection closed--goodbye')
- break
- if data:
- print 'send...'
- vt.send(data)
- print 'send...done'
- continue
- event = stdwin.pollevent()
- if event:
- type, window, detail = event
- if window == None and type == WE_LOST_SEL:
- window = ui.queryform.window
- event = type, window, detail
- if type == WE_CLOSE:
- break
- if window in ui.windows:
- ui.dispatch(type, window, detail)
- elif window == vt.window:
- if type == WE_NULL:
- pass
- elif type == WE_COMMAND:
- if detail == WC_RETURN:
- tn.write('\r')
- elif detail == WC_BACKSPACE:
- tn.write('\b')
- elif detail == WC_TAB:
- tn.write('\t')
- elif detail == WC_UP:
- tn.write('\033[A')
- elif detail == WC_DOWN:
- tn.write('\033[B')
- elif detail == WC_RIGHT:
- tn.write('\033[C')
- elif detail == WC_LEFT:
- tn.write('\033[D')
- else:
- print '*** Command:', detail
- elif type == WE_CHAR:
- tn.write(detail)
- elif type == WE_DRAW:
- vt.draw(detail)
- elif type in (WE_ACTIVATE, WE_DEACTIVATE):
- pass
- else:
- print '*** VT100 event:', type, detail
- else:
- print '*** Alien event:', type, window, detail
- continue
- rfd, wfd, xfd = select.select([tn, stdwin], [], [])
-
-
- # Subroutine to define our screen recognition patterns
-
- def define_screens(vt):
- vt.define_screen('menu', {
- 'title': ('search', 0, 0, 80,
- ' SEARCH FUNCTIONS +OTHER FUNCTIONS '),
- })
- vt.define_screen('search', {
- 'title': ('search', 0, 0, 80, ' Search '),
- })
- vt.define_screen('shortlist', {'title': ('search', 0, 0, 80,
- ' Short-list')})
- vt.define_screen('showrecord', {
- 'title': ('search', 0, 0, 80, ' Show record '),
- })
- vt.define_screen('timelimit', {
- 'limit': ('search', 12, 0, 80, ' TIME LIMIT '),
- })
- vt.define_screen('attention', {
- 'BASE': ('copy', 0, 0, 0, 'search'),
- 'title': ('search', 10, 0, 80, ' ATTENTION ')})
- vt.define_screen('syntaxerror', {
- 'BASE': ('copy', 0, 0, 0, 'attention'),
- 'message': ('search', 12, 0, 80, ' Syntax error'),
- })
- vt.define_screen('emptyerror', {
- 'BASE': ('copy', 0, 0, 0, 'attention'),
- 'message': ('search', 12, 0, 80,
- ' Check your input. Search at least one term'),
- })
- vt.define_screen('unsortedwarning', {
- 'BASE': ('copy', 0, 0, 0, 'attention'),
- 'message': ('search', 12, 0, 80,
- ' Number of records exceeds sort limit'),
- })
- vt.define_screen('thereismore', {
- 'BASE': ('copy', 0, 0, 0, 'showrecord'),
- 'message': ('search', 15, 0, 80,
- 'There is more within this record. Use the arrow keys'),
- })
- vt.define_screen('nofurther', {
- 'BASE': ('copy', 0, 0, 0, 'showrecord'),
- 'message': ('search', 17, 0, 80, 'You cannot go further\.'),
- })
- vt.define_screen('nofurtherback', {
- 'BASE': ('copy', 0, 0, 0, 'showrecord'),
- 'message': ('search', 17, 0, 80,
- 'You cannot go further back'),
- })
-
-
- # Class to implement our user interface.
-
- class UserInterface:
-
- def __init__(self):
- stdwin.setfont('7x14')
- self.queryform = QueryForm()
- self.listform = ListForm()
- self.recordform = RecordForm()
- self.forms = [self.queryform, self.listform, self.recordform]
- define_query_fields(self.queryform)
- self.windows = []
- for form in self.forms:
- if form.formheight > 0:
- form.open()
- self.windows.append(form.window)
-
- def __del__(self):
- self.close()
-
- def close(self):
- for form in self.forms:
- form.close()
-
- def dispatch(self, type, window, detail):
- for form in self.forms:
- if window == form.window:
- form.dispatch(type, detail)
-
-
- def define_query_fields(f):
- f.define_field('name', 'Name auth./ed.', 1, 60)
- f.define_field('title', 'Title', 4, 60)
- f.define_field('shelfmark', 'Shelf mark', 1, 60)
- f.define_field('class', 'Prim. classif.', 1, 60)
- f.define_field('series', 'Series', 1, 60)
- f.define_field('congress', 'Congr. pl./year', 1, 60)
- f.define_field('type', 'Type', 1, 60)
-
-
- class QueryForm(Form):
-
- def __init__(self):
- Form.__init__(self, 'Query form -- CWI Library')
-
- def dispatch(self, type, detail):
- if type == WE_COMMAND and detail == WC_RETURN:
- print '*** SUBMIT ***'
- else:
- Form.dispatch(self, type, detail)
-
-
- class ListForm(Form):
-
- def __init__(self):
- Form.__init__(self, 'Short list -- CWI Library')
-
-
- class RecordForm(Form):
-
- def __init__(self):
- Form.__init__(self, 'Record detail -- CWI Library')
-
-
- main()
-